這篇介紹Sequence
概述
Sequence類似 Identity Column ,
差別在於 Sequence 不屬於Table Level 而是屬於 DataBase Level,
且Sequence也不參與交易
管理
可以透過新的system catalog (sys.sequences) ,
查看現在數值、累加數值、起始數值..等資訊。
select t1.name,t1.type,t1.type_desc,t1.is_cached,t1.cache_size,t1.current_value,
t1.minimum_value,t1.maximum_value
from sys.sequences t1
改善
以前SQL Server還沒有Sequence物件時,如果你想要很多資料表共用相同流水號,
大概都會在額外建立一個資料表來維護流水號,而每個AP的取號基本會有2步驟:
1.查詢該資料表最大編號。2.更新紀錄到該資料表並取號(以步驟1編號+1),
而這麼麻煩(參與交易)的處理過程是不會出現在 Denali 的,
因為 Denali多了 Sequence 新物件並解決共用相同流水號的問題,
且SQL Server Sequence 和Oracle Sequence 功能上並無差異。
操作示範
--建立MySerial Sequence
create sequence MySerial
start with 1
increment by 1
--建立 A 和B資料表
create table A
(
serial int,
name varchar(10)
)
create table B
(
serial int,
name varchar(10)
)
--新增資料。A 和B 共用 MySerial
insert into A
select next value for MySerial, 'rico' union all
select next value for MySerial, 'papa'
insert into B
select next value for MySerial, 'rico' union all
select next value for MySerial, 'papa'
--結果
select * from A
select * from B
next value=增加sequence的值。
Sequence歸0
--歸 0
alter sequence dbo.MySerial
restart with 0
--確認當前流水號
select t1.name,t1.current_value
from sys.sequences t1
不參與交易
select t1.name,t1.current_value as '交易前'
from sys.sequences t1
begin tran MYTRAN
insert into a select next value for MySerial,'ricoisme'
rollback tran MYTRAN
select t1.name,t1.current_value as '交易後'
from sys.sequences t1
--確認資料 A
select * from a
雖然回復整個交易,但因為sequence 不參與交易,所以依然 value + 1。
MS SQL Server新特性探險:探險代碼 Denali 全系列文章